package org.convallaria.system.biz.entity;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.convallaria.infrastruct.db.entity.BaseEntity;

import java.io.Serial;
import java.time.LocalDateTime;

/**
 * 系统操作日志实体类
 * 
 * 功能特性：
 * - 支持用户操作行为记录
 * - 支持多租户数据隔离
 * - 支持软删除机制
 * - 支持乐观锁并发控制
 * - 支持数据审计追踪
 * - 支持操作状态管理
 * - 支持业务类型分类
 * - 支持操作类别分类
 * - 支持性能监控（消耗时间）
 * 
 * 业务说明：
 * - 操作日志是系统安全审计的重要组成部分
 * - 记录用户的所有操作行为和结果
 * - 支持操作成功和失败状态记录
 * - 支持不同业务类型的操作分类
 * - 支持不同操作类别的用户分类
 * - 支持操作性能监控和优化
 * - 支持操作参数和结果记录
 * 
 * 关联关系：
 * - 与用户表：多对一关系，通过oper_name关联
 * - 与部门表：多对一关系，通过dept_name关联
 * - 与租户表：多对一关系，通过tenant_id关联
 * 
 * 数据约束：
 * - title：模块标题，可以为空
 * - business_type：业务类型，0-9之间的值
 * - operator_type：操作类别，0-2之间的值
 * - status：操作状态，0=正常，1=异常
 * - oper_time：操作时间，可以为空
 * - cost_time：消耗时间，可以为空
 * 
 * @author convallaria
 * @since 1.0.0
 */
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("sys_oper_log")
public class SysOperLog extends BaseEntity {

    @Serial
    private static final long serialVersionUID = 1L;

    /**
     * 日志主键
     * 主键，自增长
     */
    @TableId("oper_id")
    private Long operId;

    /**
     * 模块标题
     * 操作所属的模块标题
     */
    @TableField("title")
    private String title;

    /**
     * 业务类型
     * 0=其它，1=新增，2=修改，3=删除，4=授权，5=导出，6=导入，7=强退，8=生成代码，9=清空数据
     */
    @TableField("business_type")
    private Integer businessType;

    /**
     * 方法名称
     * 调用的方法名称
     */
    @TableField("method")
    private String method;

    /**
     * 请求方式
     * HTTP请求方式（GET、POST、PUT、DELETE等）
     */
    @TableField("request_method")
    private String requestMethod;

    /**
     * 操作类别
     * 0=其它，1=后台用户，2=手机端用户
     */
    @TableField("operator_type")
    private Integer operatorType;

    /**
     * 操作人员
     * 执行操作的用户名称
     */
    @TableField("oper_name")
    private String operName;

    /**
     * 部门名称
     * 操作人员所属部门名称
     */
    @TableField("dept_name")
    private String deptName;

    /**
     * 请求URL
     * 操作的请求URL
     */
    @TableField("oper_url")
    private String operUrl;

    /**
     * 主机地址
     * 操作的主机IP地址
     */
    @TableField("oper_ip")
    private String operIp;

    /**
     * 操作地点
     * 根据IP地址解析的操作地点
     */
    @TableField("oper_location")
    private String operLocation;

    /**
     * 请求参数
     * 操作的请求参数
     */
    @TableField("oper_param")
    private String operParam;

    /**
     * 返回参数
     * 操作的返回结果
     */
    @TableField("json_result")
    private String jsonResult;

    /**
     * 操作状态
     * 0=正常，1=异常
     */
    @TableField("status")
    private Integer status;

    /**
     * 错误消息
     * 操作异常时的错误消息
     */
    @TableField("error_msg")
    private String errorMsg;

    /**
     * 操作时间
     * 操作执行的时间
     */
    @TableField("oper_time")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime operTime;

    /**
     * 消耗时间
     * 操作消耗的时间（毫秒）
     */
    @TableField("cost_time")
    private Long costTime;

    /**
     * 租户ID
     * 多租户数据隔离标识
     */
    @TableField("tenant_id")
    private Long tenantId;
}
